{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# KKT conditions for constrained optimization problems\n", "\n", "**Randall Romero Aguilar, PhD**\n", "\n", "This demo is based on the original Matlab demo accompanying the Computational Economics and Finance 2001 textbook by Mario Miranda and Paul Fackler.\n", "\n", "Original (Matlab) CompEcon file: **demopt06.m**\n", "\n", "Running this file requires the Python version of CompEcon. This can be installed with pip by running\n", "\n", " !pip install compecon --upgrade\n", "\n", "Last updated: 2021-Oct-01\n", "
" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "from compecon.demos import demo\n", "\n", "plt.style.use('seaborn')\n", "%matplotlib inline" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "scrolled": true, "pycharm": { "name": "#%%\n" } }, "outputs": [ { "data": { "text/plain": "
", "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlQAAAETCAYAAADwLZhgAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAABPPUlEQVR4nO3dd3gU1frA8e+m954QQoCQAJOEhFBCB2kBpAkiUkX02n5iL9jL9VqvIooN8QoKSBFEERVBQQXpvYdJ6C0hhZDes78/NiCBlE2d3ez7eR4eyOzszLsh5807Z86co9Pr9QghhBBCiJqz0joAIYQQQghzJwWVEEIIIUQtSUElhBBCCFFLUlAJIYQQQtSSFFRCCCGEELUkBZUQQgghRC3ZaB2AqDlFUU4BY1VV3VXJPu7AD6qqDmigmPSAr6qqKddtPwX4Ak1UVc26ZvtdwFfA7aqqfleD890CxKiq+mht4hZCaENRFGvgMWASht9JdsBPwCuqquZrHFsQcBLYqKpq3+te+xqYSjn5zshj/wc4pqrqgjoIVZgA6aFq/DyBrloHUSoFGHPdtjuBizU9oKqqq6SYEsKszQZ6AANVVe0AdAEU4Estg7pGHqAoitLyygZFUZyBXrU5qKqqr0gx1bhID1UjoShKHvAOMBhoCryrqupsDL0/joqi7AM6A22BWYA3YA18pKrqPEVR+pVuzwZcgOnAK8AJIAKwBR5QVXWzoihtgU8B19Jz7QPGq6qaV0WY3wB3AAtKY25Zeq6j13yOfwEPYLhK9QLeUVV1tqIorwJDgD4Yerr2AJOBlhh66UYoivIXsBvoDvgBXwD+QF/AGRinqurB0v0+udIjdu3Xpd/HmUBMaWz/Bm4HIoELwEhVVbOr+JxCCCOU9gBNBpqqqpoBoKpqtqIo/0dpwVLay/4p0AHQA78CL6iqWqQoSj7wIxBVepxNlJ8HURTlHmAaho6EVOBhVVWPlvY0eQEhwM+qqj57XZjFwLelx3+rdNuY0vM+VXpsK+ADDLnHFdAB9wJbgd+B3aqqPqMoSgzwNYZc/F/gkKqqM4zNO9ffAbjyNYYc/TZwBkMxml36fXi09OsVqqo+Ydz/iqgp6aFqPOyBFFVVewJjgQ8URXEA7gZyS6/8dMB3wHOqqnbGUGg8rShK99JjRAATVVVtD+QD3YD3VVXtiKEwu5JM7gPmq6raHWgNtAKGGxHjL0CUoihNS7+eQmlxBaAoikvpsYeVnnM88G7py28AhRgKvYUYCqA/yzlHkKqqvTAUbu8Cf6mqGg2sAR4xIkZ7IFFV1a7AfAxXyY8D4YA7MMqIYwghjNMZOHylmLpCVdVEVVVXlH75EYYCKBKIxlA8PV36mh3wk6qqSunQh3LzoKIofTHcnutTmlveBX645pROqqq2K6eYumIBhnx1xVQMhdEV3YAAoIeqquEYcsdzqqqWYMhFdyqKMqr0PZNUVb2+V74u8k4XDBegHYAM4HkMebkT8JCiKAFGHEPUghRUjcuPpX/vwdBAna97vS2Gq7B5pT1WGwBHoGPp62dVVT19zf6nVVXdd80xvUr//SyQrCjKMxi66wMwXFVVpQBDQTep9OvxwOIrL5aOrRoBDFcU5XXgxSvHVVW1GMMV4rMYCsO3KzjH96V/Hy/9e801X3vduHu5riTy48BBVVXPlybGk9U4hhCiaiVU/XtoKIYLKH3pmKrPS7dd8fd1+5eXB4djuPjbUpr73gU8FUW50p43VRaAqqq7gWJFUToritIccFVV9dA1r28FXgIeUBRlBoZi7kruSsBwofgDMEdV1Y0VnKa2eeekqqp7rznGn6qqFpT2ZmUYeQxRC1JQNS65AKqqXlmgUXfd69ZAuqqqHa78wdBF/VXp61nX7Z97zb/11xxvCXA/cBpDN/eecs5VkQXAHYqi9DSEql668oKiKIEYbh+2xJDgXrruvS1LYwrBMDasPGUGsaqqWljOPtd+FjBc5VZ0jPLeL4SoG9uBMEVRXK/dqChKM0VRflEUxRHD76lrF521wjAE4Ypy89Z1edAaWHhN3uuEobcrrYJjlGchht6mKaX/vjbe4Rh64MFQ0H1O2RzTDsNY0W6VHN/YvKMrPWdleauqY4h6IAVV41cEWCuKogNUIFdRlDsASq+0DmHodq+OIcB/VFX9tvTrbhgSVpVUVd2OoVfsLcp2mYMhwSVjuL33G4beKhRFsVYUxQNYBNyFoaCbW82Yr5Vcei4URQkH2tfiWEKIGlJV9QKGdj1PURQ3gNK/PwNSVVXNBdYCDyuKolMUxR7Dxdzv1TzVWmDiNcMN/g9YX81jfINhXFOZnvVSgzDcepwN7AJGU5oTFUXpiuEpxmjAXVGUx6p53mtdzV3809MvTIQUVI1fArADOIxhsOQo4F5FUQ5gKFpeVlV1czWP+QLwg6IoB4E5GG4dtq7G+xdiGCi55rrtvwHnMBR+sUALDAmkNfA/DANGf8MwYDNYUZRp1Yz7ijeAwYqiHAL+A1TUBS+EqH/TgCP8cztue+nX95a+/iiGh0wOlv5RgTerc4LSvPFf4PfS3DcJGHNNL5YxxziPIS/FX9uzXupzoF9pTtyD4ZZbq9IB9UuAR0rffxfwiqIoHamZR4FPFUXZA4RhyO/CROj0eqN/noQQQgghRDmkh0oIIYQQopakoBJCCCGEqCUpqIQQQgghakkKKiGEEEKIWtJ06ZmiomK9jU3VT9vrXis7xZH+VRlIL4TWatEujZ2zzOQZk8MkfwlhmmrYNivMX5oWVGlpOTV6X3JyZh1HIoSoLWPbpa+va9U7mYma5DDJX0KYJmPaZmX5S275CSGEEELUkhRUQgghhBC1JAWVEEIIIUQtSUElhBBCCFFLmi49k5ycWa2T+/q6yoBOIUxMddulr69ro3nKrzo5TPKXEKapOm2zsvwlPVRCCCGEELUkBZUQQgghRC1pOg+VEEKYs1WbT9I+xJsWTVyx0pV/J0CXkY79Tz9CVhoOLp7kjxyF3s29gSMVQtQ3KaiEEKKGVv59kpV/n8TNyZbIEG86tPYlopUX9naG2dOdPngPp1kz0eVkA+AKuLz4LDmPPUnOE9M1jFwIUdekoBJCiBp6cHQEB4+ncuBEKpsPJrL5YCI21laEB3kyYed3RH4964b36HKycX77dQApqoRoRMziKb+n/noUAAcHW/LyCnm/30f1GpcQomo1bZeN8Sm/Er2e04mZ7I1PZl98CpfOJfH1F/fgWJhX4Xv1Ts6kHlTRu7o1WLxCiH/UJIdVlr/MoqDy+6xswkmallEv8QghjFfTdtkYC6rrFfzvS5q9+GSV78/88FPyJk2p87iEEFWrSQ6TaROEEKIBeWReMmq/U3vjyMotrOdohBANQcZQCSFEHStp4m/Ufn8kFPPnx5uIDPamZ4Q/Ua29sbWxrufohBD1QQoqIYSoY/kjR+Hy4rNXn+4rT4mTE373TCbgZDb7jqWw71gKTvY2dAnzo1dEU0KauaGrYCoGIYTpkYJKCCHqmN7NnZzHnrz6NF95ch97ipj+7YjpD2eTsth6KJGtRxLZsO8CG/ZdoKm3E73bN6VnO3/cXewbMHohRE1IQSWEEPXgypQI+hmv43LNMCm9k/MN81A193Oh+YDWjO0XwpHTl9h0IIE9cSks//M4K/46QVRrb26KCiAy2BsrK+m1EsIUSUElhBD1JOeJ6YToX2fsEWiaBQku8O4HFU+VYGWlI6KVNxGtvMnKLWT7kYtsOpDA3vgU9san4O1mT5+oAPq0D8DTVXqthDAlUlAJIUQ9ynSArzr98/V/jZx3ysXRloGdAxnYOZDTiZn8te88245cZOXfJ1m16RQd2vgwoFMzwlp6ylgrIUyAFFRCCGHiWvq7MvXmUMb1b8322Iv8tfc8e+KS2ROXTFNvJwZ0CqRnhD+O9pLShdCKtD4hhDATjvY29OvQjL5RAZy4kMEfe86xIzaJRb/HsWLDcXpFNmVQdCB+nk5ahyqExZGCSgghzIxOpyOkmTshzdwZN6ANG/df4K+951m/+xx/7D5HhzY+DO7SnLbNPeR2oBANRAoqIYQwY+7OdozsGcTQbi3YrSbz286zVwext2jiws1dW9AlzA9rK1kYQ4j6JAWVEEI0AjbWVnQLb0LXMD+On8/gt51n2B2XzBc/HWHFhhMM7tKcPlFNcbCTtC9EfZCWJYQQjYhOp6N1oDutAyNJupzL7zvO8veBCyxZH8+qzSfp3ymQQdGBuDrZaR2qEI2KTq8vd7H0BlHRSu3X25+0FwBPT2fS0rKJ8utYr3EJIapW03ZZ2Wrt5saYHGYK+Sszp4A/9hjGWGXlFmJna0W/Ds0Y0rWFzGclLFZN2mZl+cssCqorfH1dSU7OrK9whBA1UN12aWkF1RWmkL/yC4vZuP8Ca7afIS0zHxtrHb0imzK0e0v8PBw1jU0IrVSnbVaWv+SWnxBCWAh7W2sGRTenf8dmbDmUyOptp9mw7wJ/70+gZ6Q/I3oGSWElRA1JQSWEEBbGxtqKm6IC6B3ZlB1HL/LT5lNsOpDAloOJ9IzwZ0TPljKXlRDVJAWVEEJYKCsrHd3D/eka2oRdahKrNp9i08EEthxKpFekPyN7BeHjLj1WQhhDCiohhLBwVlY6uoY1ITrUj11Hk/hx00n+PmAorPp2CGB4jyAZvC5EFcxiUPqCw18B4OrqQGZmHne2u7te4xJCVK2m7dLSBqWbY/4qKdGz/chFVm46QfLlPGxtrBjYKZBhPVri4mirdXhC1ImatE2zf8rP77Oyq7MnTcuol3iEEMarabu0tILKnPNXUXEJmw8msGrzKdIy83G0t2FY9xbERDfH3tZa6/CEqJWatE15yk8IIUS12Vhb0bdDM3pG+PPHnvP8vOUUKzacYN3uc4zq1Yre7ZtiYy1L2ggBIC1BCCFEpWxtrBnStQX//b+ejOjZktz8IhasVXl13g72xaeg5Z0OIUyF9FAJIYQwipODDWNuCmFAp0BWbT7Fxn0X+GjFAUJbeDBuQGuC/N2qPogQjZT0UAkhhKgWDxd77hyi8No9XYkK8ebomcv85+td/O+nw1zKyNM6PCE0IT1UQgghaqSZjzOP3R5F7KlLfPvnMbYevshuNZmh3Vtyc7cWMnBdWBTpoRJCCFErYUFevHJXF/41LAxHext+3HSSF77YxrbDiTK+SlgMKaiEEELUmpVOR+/2TXnr/u4M79GSzJxCvvjpCG9/s4fTibKovWj8pKASQghRZxztbbitbwhv3teNzoovx86n85+vd7JgrUpWbqHW4QlRb2QMlRBCiDrn6+HIQ7dGcvjUJRb/Hsdfe8+zM/Yit/UN4aaoAKysGs38rkIA0kMlhBCiHrUL8uK1f3VlXP/WFJfoWbBW5Y0FuziZYD4zxgthDCmohBBC1Csbaytu7taCt+7vTvd2TTiVmMkb83fxzW8qOXlyG1A0DlJQCSGEaBAeLvbcP7Id0yd2xN/biT/2nOeF/21nqzwNKBoBKaiEEEI0qLCWnrz2r67c1jeYvPwi/vfTEd7/dh9JaTlahyZEjZnFoPQZfWcB4OrqQGamzMIrhCmQdmkc+T6Vz8baiuE9guga1oRvfovj4IlUXp67g1t6BTGkawtZdFnUu7pumzotu1mTkzOrdXJfX1eSk2U+EyFMSXXbpa+va6N5vKs6OUzyV8X0ej07jyax+Pc4MnIKCfR1ZurNoYQ0c9c6NGEBqtM2K8tfcgkghBBCUzqdjq5hTXjz/u7cFBXAueRs3lq4myXr4skvKNY6PCGMIgWVEEIIk+DsYMtdQ0N5dlJH/Dwd+X3XWV6eu50jpy5pHZoQVZKCSgghhElRWhgGrQ/t1oLUjDxmLN3H17/GyhQLwqRJQSWEEMLk2Nlac3v/1rx0ZzSBvi5s3J/Ay3N3cPBEqtahCVEusxiUvj9pLwCens6kpWUT5dexXuMSQlStpu3S0galS/6qvaLiElZvPc1PW05RXKKnd/umTBjQBicHs3hQXZiomrTNyvKXWRRUfp+5lfk6aZosWSCE1mraLi2toJL8VXfOXMxk3i+xnEnKwtPVnruHhhIR7K11WMJM1aRtylN+QgghzF6LJq68NDWaW3oFkZFdwMxl+1mwViWvoEjr0ISQgkoIIYT5sLG2YnSfYF66M5pmvs78tfc8/563k2Pn0rUOTVg4KaiEEEKYnZb+rrwyNZqbu7Ug+XIuby/azXd/HaewqETr0ISFkoJKCCGEWbK1sWZc/9Y8O7kT3m4OrN52mjcW7OJ8cpbWoQkLJAWVEEIIs9a2uQev/asrN0U15WxSFv+Zv4t1u86i5UNXwvJIQSWEEMLsOdrbcNfQMB4eE4m9rTWL18XzwfL9pGflax2asBBSUAkhhGg0OrX15T/3dCWilReHTlzi5bk72BefonVYwgJIQSWEEKJR8XCx5/FxUUyKaUNeQTEfrTjA4t/jKCyShZZF/ZGCSgghRKNjpdMRE92cV6ZGE+DjzLrd53hjwW4upGRrHZpopKSgEkII0WgF+rnw8tRo+nUIMAxY/3onG/dfkAHros5JQSWEEKJRs7e15s6bQ5k2OgIbayu+/vUoX/x0hNx8mWFd1B1ZWVIIIYRFiA71I6ipK3NWHWb7kYucTMjgwVERtPR31To00QhID5WwWLqMdBwWLcBp5rs4LFqALkOWrhCisfNxd+TZSZ0Y2q0FSWm5vLlwN3/uOSe3AEWtmUUP1ZTwuwBwcLAlL69Q22BEo+D0wXs4zZqJLuefAaouLz5LzmNPkvPEdA0jMx/SLo0j3yfTY2Ntxe39W6O08ODLn2NZ+FscsWcuc/fQUBztzeLXoqgDdd02dVpW5cnJmdU6ua+vK8nJmfUVjrAQTh+8h/Pbr1f4evbzL0tRVQ3VbZe+vq66egynQVUnh0n+Mk2XMvL4YtVh4s6l08TTkYdujSTQz0XrsEQDqk7brCx/yS0/YVF0Gek4zZpZ6T5Os2aiy8xooIiEEFrycnNg+qSODO3WgotpubyxYBebDyZoHZYwQ9K3KRoFvV7P5awCUjPySE3PM/ydkUdmdgHZeUVk5xaSnVdItx2reTCn8nlodDnZ/PL0TA7cdAuuTra4Otnh5mSLt7sDfh6O+Ho44uFqj5Wu0XS0CGHRrK0MtwBbB7rz5c+xzP0llrizl5k8qC12ttZahyfMhBRUwuzk5BVxKjGD88nZnE/JKv07m7yCimdBtrezxsXBhmaFxnXrOlxKJv7sZSq6n2NjrcPP04lAX2ea+7nQ3M+VFk1ccHe2QyeFlhBmqWMbX16924XZPxzi7wMJnL6YyUO3RuLr4ah1aMIMSEElTJper+diWi7xZy9z/EI6x89ncCElu0yhY22lw9/biaZeTvi4O+Lt7oCXmz3ebg64u9jj7GCDjbXh7raD+3H4/esqzzvs1u70ndCP7NwiMnIKSM8uIDU9j+TLuVf/JKTmcCElmx2xSVff5+lqT5tAd9oEetAm0J1AXxesrKTAEsJc+Hk48sKUTiz6PZ6N+y/wn693cv8t7YgM9tY6NGHiZFC6MDlZuYUcPZ3GoZOXOHzyEqkZeVdfs7O1IripG8EB7rRo4kIzH2eaeDldLZiqostIx7t9aJmn+66nd3Im9aCK3tWt0mOV6PWkpOdx9mIWZ5MyOZuUxfHz6WTk/PO0iKO9DeFBnkQGexMZ7I2nq71RcZoTGZRuHMlf5mfj/gt881scxcUljOrTihE9g+RWfyNUV4PSzaKg8vus7C+2pGkyYLixSU3PY3dcMnvUJOLPp3Plx9LZwYawIC9CW3gQEuBOoJ8z1la1e5aiPp/y0+v1JKXlEnfuMvHn0jl6Oo2U9H8KwkBfF6Jae9Ml1I/mfi5mfXuwpu3S0goqyV/m7WRCBp/9cJDUjHyiQry5b2Q4Tg62Wocl6kBN2mZl+Utu+QnNXMrIY/uRi+xSkziZYLg60AEhge5EtvKiXStvgvxd6/yW2ZVi6fp5qPROzrWeh0qn09HEy4kmXk70aR9w9ZblweOpHDyRytEzlzm3NYtftp6miacjXcL86BLahEBfZ7MuroRorFo1deOVu7rwxarD7D+eyuvzd/HIbe0J8HHWOjRhYqSHSjSo/MJi9sYls/lgAkdOpaHHsCp8WEsPOit+dGzjg7tLw9wW02VmYP/Tj1hdTKSkiT/5I0dVeZuvtvILijl0MpUdsUnsP55CQWEJAIG+zvRpH0CPCH9cHM3j6ld6qKSHypKUlOhZseE4v24/g4OdNfeNCKdjW1+twxK1ID1UwiydS8rijz3n2B57kdx8w9N4rZu50zPSn2jFT5MiQu/qRt6kKQ16Tns7azorfnRW/MgvKObAiVR2HLnIvmMpLFkfz/K/jtGprS992gcQFuQp4zWEMBFWVjpu79+aFk1c+Wp1LB9/f5BbegVxS+9W0k4FIAWVqEfFJSXsi09h/e5zHD1zGTA8BTegUyC9Ipvi7+WkbYAas7ezpkuoH11C/cjIKWDroUT+PpDAjtgkdsQm0dTbiZjo5vRs54+9ncyFI4Qp6BbehKbeTnzy/UFWbT7FmYtZ3DcyXJasEVJQibqXV1DEhn0X+H3XWS5l5AMQ1tKTmM6BRLX2kWkEyuHmZMeQri0Y3KU5xy9k8Nfe82w/cpGFa1W+33CcmzoEMLBTIF5uDlqHKoTFa9HElVfu6sLslYfYdyyFtxbu5pGx7fGT+aosmhRUos5k5Rayfvc51u06S3ZeEfa21vTv2IwBnQNpJgM4jaLT6WjdzJ3Wzdy5vV8If+49z597z/PrtjP8tuMsvSL9GdYjSBK3EBpzcbTlyfFRLF1/jPW7z/H61zuZdmskYS09tQ5NaEQKKlFrGTkFrNl2hj/3nSe/oBhnBxtG92nFwM6BOMvjxTXm7mLP6D7BDO/Rkm2HL7J6+xk27k9g04FEerRrwvCeQRZ/21QILVlbWTF5UFsCfZ355rc4Zn67j0kxbejfKVDr0IQGpKASNZabX8TaHWdYu/Ms+QXFeLjYcWvvVtzUIQAHO/nRqiu2Ntb0iQqgV2RTdh5N4qctp9h8KJEthxPp0c6f0X1a4eMuPVZCaKVvh2Y09Xbm0x8OsvC3OM4lZzMxpo3REw6LxkF+64lqKygs5o895/ll6ymy84pwc7ZjbN8QbooKwNZGEkh9sbLS0S28CV3C/NijJrNq80m2HEpkR+xFBnQKZETPILOZckGIxqZtcw9enhrNR98d5M+950lKy+HB0REyCagFkYJKGE2v17MjNonlfx3jUkY+jvY2jLkpmEHRzeUptAZkpdMRHepHJ8WX7Ycv8v3GE/y28yx/H7jAsO4tGRTdHDtb+f8QoqH5uDvy/B2d+N9PR9h3LIU3F+7m0bHtaeIpt+YtgRRUwiinEjNYvC6eY+fSsbHWMbRbC4Z2byk9Ihqy0unoEeFPdKgff+49z89bTrFiwwk27LvAxIFt6NDGR2ZfF6KBOdrb8PCYSL776zhrdpzhjfm7eHhMJEoLGaze2ElBJSqVkV3Aig3H2XQgAT3Qqa0v4wa0lqfMTIitjRWDuzSnd2RTft5yit93neXj7w8S0cqLiTFtaOotT1gK0ZCsrHSMG9Aaf28nFq5VmbF0H3cNDaVXZFOtQxP1SAoqUS69Xs/fBxJY/ucxsvOKaObrzKSBbQgL8tI6NFEBJwcbxg1oTe/2TVmyLo5DJy/xytwdDO7SnFt6t8JebgMK0aBuigrAz8ORT384yNxfYklKy2V0n1bSc9xImUVB1d63AwA2NlYUFZVoG4wFSEjNZv4albizl7G3s2ZiTBsGdGqGtZUMODcHAT7OPDm+A3viUli6Pp5ft59hl5rE1JtDCa/DgljapXHk+2TZQlt68sKUzny4fD8/bTlF8uVc7h4Wiq2NXOBora7bplksjnyFr68rycmZ9RWOxSsqLuHnLadYve00RcV6OrbxYfKgtjI7txnLLyzmx00nWbvjDHo99I5syrgBret07Ft126WlLY58heQvy5aRU8DHKw5w/HwGbQLdeXhMJK5OdlqHJahe26wsf0lBJQA4czGTL3+O5VxyFp6u9kwe1JZOspJ6o3EqMYOvVx/lTFIWbs52TBms0Fmpm/9fKaiMI/lLFBYV8+XPsew8moSfpyNPjovCT54A1JwUVKJOFJeUsHrbGVZtOklxiZ6+HQIY17+1LPTZCBUVl/DbzrP8uOkkhUUl9IzwZ1JMW5wcavd/LQWVcSR/CYASvZ7vN5xg9bbTuDrZ8ujY9oQEuGsdlkWrq4JKfmtasITUbL78+QgnEzLxcLHj7mFhRAZ7ax2WqCc21lYM696Sjm18+OKnI2w5lIh6Jo17hocTKuuPCdEgrHQ6xvYLwdvdgW9+U3lv8V4euKUdHeWOgNmTHioLpNfr2bj/AkvWxVNQVEKPdk2YNKitrLtnQa6Ml/t5y2lK9HoGd2nObX1DajTTvfRQGUfyl7jevmMpfP7jIQqLSpgU05aBnWUNQC3UVQ+VPLZlYXLyCpn942Hmr1GxsbZi2ugI7hvZToopC2NjbcXoPsE8P6UTTTwd+W3nWd5auJuLaTlahyaExejQ2odnJ3XC1dGWRb/H8d1fx9Gyk0PUjln0UMUsvwn459HGdbdvrNe4Gqvj59OZs+owKel5tA5054GR7fB2lyf4LF1+QTGL1sWx6UACDnbWTL05lG7hTap8X03bpaX1UEn+ElVJupzLB8v2c/FSDj0j/LlraKgsrNwAatI2zX4M1YHkfVqHYNb0ej1rd5y9evUzsmcQt/QOknmlBAD2dtb8a1gYYS08WbBWZc6qwxw9k8bEgW0qXRNQ2qVx5PskquLnYVgDcNbyA2w5lEhGTgHTRkfgYGcWv6LNVl23TfmN2sjl5hfx2cpDLPvzGK7Otkyf2JFbbwqWYkrcoEeEP6/e3YXmfi5s2HeBNxbsJkluAQrRINyc7HhmYkfah3hz6MQl3l28l4zsAq3DEtUgv1UbsQsp2byxYBe71WTaNvfg33d1kae5RKX8vZx46c7O9OvYjHPJWfzn610cPJGqdVhCWAR7O2seHhNJ78imnErM5K1vdpN0OVfrsISRpKBqpHbEXuT1+btISM1hSNfmPD2hA+4u9lqHJcyArY01dw5R+NewMAqKSvhwmWHJjBIZLCtEvbOxtuLuYaEM79GSpLRc3l64m7NJWVqHJYxQrRu0iqK0BQKBXOCQqqryDLCJKdHr+WHjCX7Zehp7W2seHB1Bl1A/rcMSZqh3+6Y083Xm0x8O8sPGE5xKyODeEeFmPemr5DBhDnQ6Hbf1DcHN2Y4l6+J5Z9EeHhvbnrbNPbQOTVSiysyoKIor8BRwD5APXAQcgGBFUbYB76mq+ke9RimMkldQxJc/x7InLhk/T0ceua09zXyctQ5LmLFWTd145a4ufL7yEHvjU3hr4W4eG9seHw9HrUMzmuQwYa4GRTfHxdGWeb/E8v63+3hwdAQdWvtoHZaogDG3/P4ALgGdVVVtrapqL1VVOwPewNvAPYqi3F+fQYqqpabn8fY3e9gTl0xYS09eujNaiilRJ9yc7HhqQgdiOgdyPiWb1xfs4tj5dK3Dqg7JYcJs9WjnzyO3tUcHfLLiIJsPJmgdkqiAMX33vVRVLVAUpQOQdGWjqqolwEZgo6IosmS2ho6dT+eTFQfIyCmkX8dmTIppI3OYiDplbWXFpEFt8fd2YvHv8by7eC+YT70uOUyYtfYh3jw9oSMfLt/P3F9iyc0vIia6udZhietU+VtXVdUrz21+qyhKj2tfUxSl73X7iAa262gS7y7eS1ZuEZMHtWXK4LZSTIl6M6BTII/f3h5bG/OZm1NymGgMWge689zkTrg727F4XTyrNp+UWdVNTHVGl44AViqK8hhwDngXaA2E10dgomq/7zrL0nXx2NlZ8+htkUTIwsaiAUQEe/PClGiWL9M6kmqTHCbMWqCfC8/d0YkZS/ax8u+T5OQVMX5Aa3Q687nAacyM7spQVTUemAz8APwJ/AxE1lNcohIlej3f/hHPknXxuDnb8dykTlJMiQZV3vi8vIIiDSIxnuQw0Rg08XTihSmdaertxG87z/LV6qMUl5RoHZagGgWVoiivAKuBT4FkIFlV1eL6CkyUr7ComDk/HmbtjrM09XbixTs709LfVeuwhDD5mZ0lh4nGwtPVnucmd6KlvyubDiYwZ9URioqlqNJadQbbtASiVVV9DogBXlQU5a56iUqUKze/iA+W7Wfn0STaBrrz/B2d8XE3n8fXReN2KjGTtxaa9HI1ksNEo+FaulRN20B3dh1N4tPvD1JYJNcHWqrOLb97VFW9UPrvJAwJ6Z76CkyUlZVbyIylezl65jId2/jw1IQOuDjaah2WEFeN6NmSpMu5vPXNHpOc2VlymGhsHO1teGJ8B9q18mL/8VQ+XH6A/AIpqrSiq81TAoqiOKqqWuOFhpKTM6t1cl9fV5KTLW9i47TMfN7/dh8XUrLpFenPXUNDZXFjYTKubZfrd59j0e9xODvY8MS4DgQHuJW3v8mMoG3IHGap+UvUv8KiEj7/0TD5butAdx4fG4WTg/muaNDQqtM2K8tfVf5WVhSlc0WvqaqaqyiKvaIooUZFIqotKS2Ht7/ZzYWUbAZFN+fuYWFSTAmTNbBzIPcMDyMnv4j3lu7l6Ok0rUOSHCYaPVsbKx4cHUG38CYcO5fOe0v3kpVbqHVYFseYEvYFRVGcgMXAdv5ZtkEBbgaGYVjW4Wh9BWmpzqdkM2PJXtKzCxjduxUjewXJ47HC5PWKbIq9rTVzVh3mg+X7eejWCNqHaLpchuQw0ejZWFtx34hw7Gys+PtAAu8u3svTEzvg5iRz1jYUYwqqIOBBYClQgmFh0RzgIIbHj/vIAqN171xyFjOW7CUjp5CJA9swqIvMiivMR3SoHw521nzy/UE+XnGQB25pR7R2i3QHITlMWAArKx1Th4ZiY2PFn3vO8+7ivUyf0AF3F3utQ7MIxhRUtsAJIF1V1Y71HI8AziZl8d4SQ5ftlCEK/Ts20zokIaotItibJ8d34MPl+/n8x8M8AHTRpqiSHCYshpVOxx2D2mJjZcXvu87yzuK9PDOxI56uUlTVN2MKqpnAIcBRUZR5wO7SP/tUVc2rz+As0enETGYs3UtOXhF3DQ3lpqgArUMSosbaNvfgyfEdmPntPub8eBi9Xs9w3wafN01ymLAoOp2OCQNbY2Oj49dtZ/jvoj1Mn9gRb3cHrUNr1Ix6yk9RFBvgCPBvoHPpn/bAeVVVazzTsLFPyDz116MAODjYkpdXyPv9PqrpKU3aqcQMZizZR25+EXcPC6N3+6ZahyREharTLo+dT2fmt/soKCzhxxm3NPhAQC1zmKXkL2F69Ho9P246yarNp/Bxd+CZiR3x8ZC5C6+oSdus7Ck/o6dNUBTFR1XVlOu2tVVVNc6oA5TD2ILK77Oyj14nTcuo6SlN1pmLmby7eC+5BUXcOzycHhH+WockRKWq2y6Pn09n5rJ9LHtrhCZPVmiVwywhfwnT9tPmk/zw90m83Rx4dpIUVVfUpG3WatqEK65PRKXbapyIxD/OJ2cxY6mhZ0qKKdFYhTRz58nxHTQ7v+QwYalG9mrFrTcFk5qRx38X7yH5co2nXhOVkAmNNJZ4KYf3lu4jK7eQqUNDpZgSjVpIgLvWIQhhkUb2DOK2vsGkZuTz38V7SJKiqs5JQaWh5Mu5vLfEsKDs5EFtZQC6EEKIejO8h6GoupSRz38X7THldTfNkhRUGrmUkcd7S/aSlpnPuP6tGdg5UOuQhBBCNHLDewRxe78Q0jLzeXfJXumpqkNSUGkgM6eA97/dR0p6HqP7tOLmbi20DkkIIYSFGNq9JWP7hXApI5/3Fu8hRYqqOiEFVQPLzS/iw+X7SUjN4eauLRjZM0jrkIQQQliYYd1bMuYmw5iqd5fsJSVdiqrakoKqARUWlfDJ9wc5mZBJ78im3N4/RNbmE0IIoYkRPYMY3acVKel5vLt4L5cyZJ7b2pCCqoGUlOj54qfDxJ5Oo2MbH6YOVaSYEkIIoalberXill5BV4uqtMx8rUMyW1JQNQC9Xs/C31R2q8kozT34v1HtsLaSb70QQgjtjerdihE9g0i6nMuMpXtJzy7QOiSzJL/VG8CqzafYsO8CLZq48OjY9tjaWGsdkhBCCAEY1v67tfQBqYTUHGYs3UtmjhRV1SUFVT37+8AFftx0Eh93B54Y1wFHe2PWoxZCCCEajk6n4/Z+IcR0DuR8cjbvf7uP7LxCrcMyK1JQ1aNDJ1JZsEbF2cGGJ8ZF4e5sp3VIQgghRLl0Oh0TY9rQr0MAZy5mMfPb/eTmF2kdltmQgqqenE7M5NOVh9DpdDw6tj1NvZ21DkmYsLlz59CvX3eef/4pjF2wXAjRcCyljep0Ou4YotAr0p+TCRl8sHw/+QXFWodlFszi/tPvYzcA4OnpTFpatsbRVC01PY8Pv9tPQUExD46OoE2gh9YhiRr6/vvlLFmykNTUFIKCgnnssaeIiupY5+eZMGEyfn5N+O9/3+DYsTjatFHq/BxQt5/H3NqlVuT71DiYYxutKSudjruHhlFYVMKO2CQ++f5Aoxz/W9dt0yx6qKL8OhLl15HOAZ2J8mvYH6zqyskzTNyZnlXA+IFtiA710zoki5eSkkxRUfW7rdev/41Zs2YwZcrdzJu3iMjI9jz99KMkJibWeYzOzi4MHToCOzs7jh8/VufHh7r/PObULrUk36fGwdg2mpdX87mcGjLnVMXKSse9I8Lp0NqHw6fSmL3yMEXFJQ0eR32q67ZpFgWVuSguKeHzVYc4n5LNwM6BDO7SXOuQGtwff6yjf/8eJCYmXN324YczGDduFJcupdbZeb7++kumTp3AoEF9GDEihjff/Df5+eUnslWrfmDMmOF8/PFM4uPjjD7H0qWLGDZsJLfccitBQa144oln8Pb2YeXK76od76lTJ6vcp7i4CEdHR06cOF7t4xujLj+PEFUxxVxQmbpqowsWzGP8+NF88MG7bN26qVqxmFobtbG24sHR7QgP8mTfsRS+/PkIJSWN93ZnbZnFLT9z8e36Yxw6cYnIYG8mDGytdTia6N9/IIsWzWf+/Lk8++xLLF68kHXr1jJ79ly8vLzr7DzFxcU89dRz+Pk14ezZM7z55r9ZtmwJU6bcfcO+kydPJSgomDVrfuHee6cQFBTM0KHDGTx4aIUxFRYWEhd3lIkTp5TZ3qVLdw4dOlCtWGNjD/PQQ/fz+uvv0KtXnwr3++qrL0lPT+fEiYqvfhcsmMfChV9Ver4ZMz664RZBXX4eIYxRnVxQ059rqF4uqEhdttGJE6cQHBzC1q2befPN18jJyaFjx8706NGT7t17ERhY/oW2qbZRWxtrHhnTnveX7WNHbBL2ttZMHRqKlUxMfQMpqOrIn3vOsW73OZr5OFv0xJ06nY4HHniI6dMfIyAgkAUL5vHRR7Np3rxuF4C+554Hrv7b378pPXr05vTpU+Xua29vz4ABMQwYEENaWhrr169lzZrVzJ79MV27dufmm0dw0039sLW1vfqe9PTLFBcX4+XlVeZYXl5e7Nq1/YZznDhxnFdffb7CeD09PXn55Wd57bW36NOnXznvP8ayZYvp1atPpb1oo0ffxoABgyp8HcDX1/eGbdX9PELUVnVyQU1/rsH4XNBQbdTV1ZWYmCHExAxBr9cTG3uYrVs3s2bNaj78cAaBgS146633CA4OKfM+U26j9nbWPD42iveW7uXvAwk42NkwYWBrWe3jOlJQ1YHDJy+x6Pd4XJ1seXRse4ufa6pr1+6EhbXjyy9n8847MwkLa1fufl988RkLFsyr9FgfffQ5nTpFl9l28WIiS5YsZM+eXSQnJ1NUVEhBQQGTJt1ZZWyenp6MHTuBsWMnsGvXDt5441W2bn2+3PMANyQMvV5fbhIJDg5h4cJllZ571qz3efXVF1mz5k/s7P6ZQkOv1/Puu28xcuRounTpxnPPPUVWVhYuLi43HMPNzR03N/cqP2dFjP08QtQFY3NBTX+uq5MLGqqNXis3N4eUlBRSU1O4dCkVOzs7/P39sbe3r/A9ptpGnRxseGp8B95ZtIffd53F2cGGW3q30josk2IWv/kXHDZ0Bbu6OpCZmced7Yzvyq1vCanZfLbyEFZW8MiY9vh6OGodkuZ2797JsWNx6PX6Sm/zjRs3iSFDhlV6rCZN/Mt8nZ5+mfvum0pUVEceeuhxfH39sLa25t577zTqqZucnBw2bPiDtWtXs3fvbiIi2nPvvQ8QHh5RZj93dw+sra1JTS071iMtLa3cz1TV1S/A+fPnePbZl8okaoCVK1eQlHSRmTM/Jj09vfR4x2jfvsMNx6jprZHqfh5jmHK7NCWW/H0yNhfU5Oe6urmgodpoQsIF/vxzHdu2beHAgX34+PjSrVsPnnzyGTp37oqjY/m/I+qjjdY1F0dbnhrfgbe/2c3KTSdxdLBhULT5jhWu67ZpFgXV0xseK/O1qSSknLxCPvruALn5Rdw3IpzWgTXvOWgs4uPjePHF6Tz++HS2bt3EnDmfMHPmJ+Xu6+HhgYeHR7WOv2XLJgoK8vnPf96+etX2668/k5ubQ5s2bct9T3FxMTt3bmft2tX8/fdfeHv7MGTIMJ555kUCApqV+x5bW1vatg1l587tDBgQc3X7zp3b6ddvwA37V3b1e/RoLNOm3cMLL7xKTMyQMq+lpKQwZ84nvPTSazg5OePk5Iyzs3OFybqmt0aq+3mMYart0tRY6vepOrmgJj/X1c0FDdVG16z5hb17d9O9ey8ef3z6Dbf2KlIfbbQ+eLra8/SEDrz9zR6WrIvHyd6GXpFNtQ6rRuq6bZpFQWWKSkr0zFl1hItpuQzt1oIeEf5Vv6mRS0xMYPr0xxg/fjIjRowiPLwdU6dOZM+eXeXeTqsJd3cPcnNz2bjxL0JCWrNt22YWLvwKJyfnCgd7Llz4FUuXfkP//jG8//4nREV1MOpcEyZM5vXXXyE8vB2RkVGsXLmC1NRkRo++rVoxh4aG8dlncwkNDbvhtQ8/fI/o6G707t336rbg4JAKnyKqzS2/uvo8QlSlurmgJj/XNckFFanLNjp69NgyxWF547maNPHHwcHhhu3m0kb9PJ14akIH/rtoD/NWx+JgZ0NnpfwxbpZECqoa+uHvExw8kUpEKy9u62vcFUhjlpGRzlNPPULPnr25++77AAgObk3//jHMmfMpc+ZU3p1vrB49enHLLWN4881/Y2dnR0zMYAYNGsrhwwcrHGcwZMgwJk6cUum4hfIMHDiY9PR05s+fS2pqCq1ahfDee7Pw96/+1Vh5iXrLlk3s2rWdb74p+0h0SEibepk6oS4/jxAVMeVcUJm6aqPLly+p0dhQMK82GujrwuPjopixZB9zVh3iidujCAvyqvqNjZhOyyn0k5MzjTq532duZb5OmpZRL/EYa0fsRT7/8TB+no68PDUaZwfbqt8kRCNT03bp6+uq/QjbOmJMDjO1/CVEXTp86hKzlu/H2tqKZyZ2pFVTt6rfZCJq0jYry1+W+Wx/LZy5mMm81bHY21nzyJhIKaaEEEJYrHZBXtw/sh0FBcV8sGw/CamWu7ySFFTVkJVbyCffH6SgsIT7R4TTzLfyR2aFEEKIxi461I8pNytk5RYy89t9XMqo+fI75kwKKiOVlOj54qfDpKTncUuvIDq2lQF4QgghBEC/Ds249aZgUjPymblsP1m5hVqH1OCkoDLSqs0nry4rI5OZCSGEEGWN6NGSmOhALqRkM2v5fvILirUOqUFJQWWEA8dT+WnzKbzdHLhvZLisYSSEEEJcR6fTMWFgG7q3a8LxCxnM/vEQRcUlWofVYKSgqkLK5Vz+99NhrK2teGhMBC6OMghdCCGEKI+VTse/hoXRrpUXB46nsmCNipazCTQkKagqUVhUzKcrD5GdV8Qdg9sS5G8+j4Nqac6cT3nkkQeq3lEI0ahJLrBMNtZWPHRrBK2aurLpYALfbzyhdUgNQgqqSiz6PZ7TiZn0jmxKn/amN7GaqTp2LK7CZWDMzfffL+f2229hwICe/Otfd7B//16tQ6qVxvZ5hGmTXGC66vvzONjZ8NjtUTTxdOSXradZt+tsnR7fFElBVYFthxPZuP8Czf1cuGNwW5NY7dtcxMfHGbVQcUNJSUmmqKio2u9bv/43Zs2awZQpdzNv3iIiI9vz9NOPkpiYWA9R1r/G9nmE6ZNcYJoa6vO4Odnx5PgOuDvbsWRdPDtiL9bp8U2NFFTlSLyUw/y1KvZ21kwbHYGdrbXWIZmNtLQ0UlKSsba25rHHHiQmpjd33TWJI0cO1el5/vhjHf379yAxMeHqtg8/nMG4caO4dKnsau2rVv3AmDHD+fjjmcTHxxl9jqVLFzFs2EhuueVWgoJa8cQTz+Dt7cPKld9V/ebrnDp1ssLXDh06QJ8+XcjJybm6LSMjg969o6sVb1Xq8vMIURXJBeWztFzg6+HIE+OisLez5sufj6CeSavzc5gKs1jLb0bfWQC4ujqQmVm/E4YVFhUze+Uh8guKuf+WcJp4OdXr+Rqb+HgVgKVLv+GRR57E29ubTz75kJdffo5vv12JjU3d/Mj17z+QRYvmM3/+XJ599iUWL17IunVrmT17Ll5e3mX2nTx5KkFBwaxZ8wv33juFoKBghg4dzuDBQ2/Y94rCwkLi4o4yceKUMtu7dOnOoUMHqhVrbOxhHnrofl5//R169epzw+vx8XEEBjbHycnpmm0qtra2tGoVfMP+CxbMY+HCytdDmzHjI6KiOtbL57l6jgZsl+bMUr9Pkgtu1FhzQVVaNHHl4TGRfLBsPx+vOMjzd3QyiYmx67ptmkVBdWe7uwHw9XUlOTmzXs+1ZP0xziZl0bdDAN3D/ev1XI1RfLyKjY0Nb775Hk2bBgDw4IOPMmXKOC5cOEeLFkF1ch6dTscDDzzE9OmPERAQyIIF8/joo9k0b97ihn3t7e0ZMCCGAQNiSEtLY/36taxZs5rZsz+ma9fu3HzzCG66qR+2tv88wZmefpni4mK8vMou9unl5cWuXdtvOMeJE8d59dXnK4zX09OTl19+ltdee4s+ffqVeS0+XqVt29Ay2+LiVIKCWpX7S2f06NvKrGZfHl/fshPPVvfzGKMh26U5s9Tvk+SC8jXGXGCM8CAv/jU8jP/9dISZy/bz0p3ReLpWb8H6ulbXbdMsCqqGsiP2In/tPU+grwsTB7bROhyzFBen0rdv/6sJFMDBwQGA4uvmI/nii89qvCo7QNeu3QkLa8eXX87mnXdmEhbWrsr4PD09GTt2AmPHTmDXrh288carbN36fIXnuX7snF6vL3c8XXBwCAsXLqv03LNmvc+rr77ImjV/Ymdnd3V7fHwc/foNKLNvXNzRCseeuLm54+bmXum5KmLs5xGitiQXVMxSc0GPdv6kZebz3V/H+WDZPp6b3Bknh8ZThjSeT1JLSWk5fP3rUextrXlwdDsZN1VDx47FMWzYyDLbjh49gqOjE4GBzctsHzduEkOGDKv0eE2aVNxLuHv3To4di0Ov11fYXX+9nJwcNmz4g7VrV7N3724iItpz770PEB4eUWY/d3cPrK2tSU0tOwYjLS2t3HNVdVUKcP78OZ599qUyCbSkpISTJ49z//3Tyux79OgRbr319nKPU5Nu/up+HiFqS3JBxSw5Fwzt1oJLGXn8sec8n3x/gCfHd8DGunEM55aCCigqLmHOqsPkFRRz34hwmno7ax2SWcrLy+PcubOUlPxz9anX61m2bAlDhgwt040O4OHhgYeHR43OFR8fx4svTufxx6ezdesm5sz5hJkzPyl33+LiYnbu3M7atav5+++/8Pb2YciQYTzzzIsEBDQr9z22tra0bRvKzp3bGTAg5ur2nTu333AFCZVflR49Gsu0affwwguvEhMzpMxrZ86cJi8vDx+ff7rljx8/xtmzZyp83Lwm3fzV/TxC1IbkAskFFdHpdEyKacvlrAL2xCXz1epY7h0R3ih6yqWgAn7cdJKTCZn0jPCnR4SMm6qpY8fiAViz5hc6dozGw8ODefO+4OLFRN5++/06O09iYgLTpz/G+PGTGTFiFOHh7Zg6dSJ79uwqt6t+4cKvWLr0G/r3j+H99z8hKqqDUeeZMGEyr7/+CuHh7YiMjGLlyhWkpiYzevRt1Yo3NDSMzz6bS2ho2A2vXRm4u2LFMsaPn0Ri4gVmzZoJGAaPlqem3fx19XmEqIrkgvJJLjCwstJx38hwZizZy9bDF/F2d2TMTTcOujc3Oi2nhE9OzjTq5PuTDBOOeXo6k5aWTZRfxyreYbzYU5eYsXQfPh4O/PvurjjaS41ZUytXfseyZUt44IGHmDXrfdLTL9O9e0+eeOJZfHx86uQcGRnpPPjgPURFdeSZZ168uv2VV57n4sVE5sy5sfs7IeECXl7e2NtXfwDk998vZ/HiBaSmptCqVQiPPvokHTp0qtVnuNZnn31EfLyKnZ0dO3Zso3nzFtx334O89dZ/iIyM4t13P6izc0Hdfp6atktfX1fzvxQtZUwOq8/8ZaokF1SfOeeCmsrIKeCtBbtJupzLXUNDuSkqoOo31aGatM3K8pdZFFR+n5Vd8iVpWkadnD8rt5BX5m4nM6eQ5+/oTHCALC0jGtaTTz5M27ah/N//Pax1KNVW03ZpaQVVfeUv0biYcy6ojcRLOby1cDc5eUU8fnt7IoIbbkxnTdpmZfmrcYwEqwG9Xs9Xq2O5nFXA6D6tpJgSmjh2LJ6QkNZahyGE0Jil5gJ/Lyceva09VlY6Pl15iDMXzXdqEYstqDbsu8De+BRCW3gwtFtLrcMRFujSpVQuXUolJESm6BDCkll6Lmgd6M79I8MpKCjmw+X7ScvM1zqkGrHIgiohNZul6+NxdrDh3hHhWFk1mjsQwox4eXmzadMugoNDtA5FCKEhyQUQHerH7f1bczmrgFnL95NXUP01F7VmcQVVUXEJ//vpCAVFJUy9ORQvNwetQxJCCCEs3pCuzenbIYAzSVl8/uNhSkq0G+NdExZXUP285RSnEg1TJESH+mkdjhBCCCEwzFE1eVBb2rXy4sDxVJasj9c6pGqxqILq+IV0ft5yGm83eybFlD9RmhBCCCG0YWNtxYOjImjm68z63ef4fddZrUMymsUUVPkFxXz50xH0ej33DA9vVOsHCSGEEI2Fk4MNj41tj5uzHUvXx7PvWIrWIRnFYgqqZX8d42JaLoO7Nie0pafW4QghhBCiAj7ujjw2tj221lbM+fGwWUynYBEF1cETqfy55zzNfJ0bxfT2QgghRGPXqqkb944IJ7+wmI9WHCA9y7SnU2j0BVV2XiFfrY7F2krHfSPCsbWx1jokYaRVq37g9ttH0bdvN959981y98nIyGDkyMGcP3/O6OO+9NIzLF36TV2FKYSoZ5acC+bOnUO/ft15/vmn0HJlE61Eh/pxW99gLmXk89GKgxQUFmsdUoUafUG1ZF08l7MKGNW7FS2auGodjjDS6dOneP/9d3j44cdZseIXHn74CcCQXL79dtHV/RYu/IoePXrRrFmg0ce+++77mT9/HllZWXUeNxjWyLr99lsYMKAn//rXHezfv7deziOEJTDnXFAXJkyYzFNPPcfff2/g2LG4ejmHqeesYd1b0jPCn5MJGXz5SywlJlpYNuqCal98ClsOJRLk78rQ7i20DkdUw6ZNG2jVKoS+ffvj4+ODk5MTABs3/kWHDp0ByMvL46efVjJ8+KhqHTskpDUBAc1Yu3Z1nce9fv1vzJo1gylT7mbevEVERrbn6acfJTExsc7PJYQlMNdcUFecnV0YOnQEdnZ2HD9+rMbHKS4upqCg4Ibt5pCzdDodU28OpW2gO7uOJrHy75Nah1SuRltQZeUWMn/NUWysddwzPAxrq0b7Uc3OqVOVN4YJE8Ywe/bHHDsWR+/e0Tz//NMApKSk4OTkiKKEArB16yasrKxo3z6qzPv/+GMd/fv3IDEx4eq2Dz+cwbhxo7h0KRWA3r1vYt26tXX5sQBYunQRw4aN5JZbbiUoqBVPPPEM3t4+rFz5XZ2fSwhz15hzQV0qLi7C0dGREyeOV+t9aWmXWLPmF1599QVGjhzMoUMHbtjHXHKWrY0VD42JxM/DkZ+3nGLbYdMp+K4wi7kDpoTfBYCDgy15eYVGvWfxujjSswu4rW8wzXxd6jE6UR2xsYd56KH7ef31d+jVq0+5+8ye/SXTpt3LzTcPZ8SIUTg4GGaz37lzG2PGjLu63/79+1CUUHS6sksH9e8/kEWL5jN//lyeffYlFi9eyLp1a5k9ey5eXoaVzMPC2jF//lzy8/Owty87W/6CBfNYuPCrSj/HjBkfERXVscy2wsJC4uKOMnHilDLbu3TpXm4iM3c1aZeWSL5P5WvMuaCuffXVl6Snp3PiROU9VCUlJcTGHmHbts1s27aZo0djCQxsTs+evXnttbdo375Dmf3NLWe5Otnx6Nj2vLlwF/NWH8XX05GQAPcaH6+u26ZZFFTv9/sIAF9fV5KTq350ck9cMtsOX6RVUzdu7ia3+hraiRPHefXV5yt83dPTk5dffpbXXnuLPn363fC6k5MzFy6cJzIyCm9vn6vbz507y91333f164sXE8q8foVOp+OBBx5i+vTHCAgIZMGCeXz00WyaN//nZ8HHx5eioiJSUlJuGHMxevRtDBgwqNLP6Ovre8O29PTLFBcX4+XlVWa7l5cXu3Ztr/R45qi67dJSWfL3yVJzQV06ceIYy5YtplevPsTHVzyG6tdff+bTTz8kOzubjh2jGTx4GP/+91uVjikzx5wV4OPM/42K4MPl+/lkxUFenhpd4yXk6rptmkVBVR1ZuYUsWKtiY20lt/o0EhwcwsKFyyrdZ9as93n11RdZs+ZP7Ozsyrx28uRxiouLadNGKbP9vvseLPN1fn4+np5lE8EVXbt2JyysHV9+OZt33plJWFi7Mq/b29uXHiPvhve6ubnj5lbzq57rr5L1ev0N24SwBJaeCwC++OIzFiyYV+k+H330OZ06Rd+wXa/X8+67bzFy5Gi6dOnGc889RVZWFi4uN951cXV1w9fXj/T0eC5dSuXSpVRSUpJp0sQfG5vKf9WbW86KDPZm/IA2LF0fz0crDvD85M7Y22n/BH+jK6iWrIsjI7uA2/uHEODjrHU4Fqmqq1KA8+fP8eyzL92QQAHi4+Pw92+Kq2vlT2W6u3uQmVn+VcXu3Ts5diwOvV5/tWv/WhkZGQB4eNw4yWtNu/nd3T2wtrYmNTW1zPa0tLRyYxCisbPUXHCtceMmMWTIsEqP0aSJf7nbV65cQVLSRWbO/Jj09HTA0GN1/a07MIwF6937JlJSUkpv+W3hhx+WAxAd3Y3u3XsyYEAMTk7//F4055w1KDqQCylZbNyfwJe/HOHB0RFYaVwENqqC6sDxFLaW3uob0kVu9WmlsqvSo0djmTbtHl544VViYoaUu098vEqbNlWvtdimjcKvv/5UzvvjePHF6Tz++HS2bt3EnDmfMHPmJ2X2OXnyGD4+vuUmjZp289va2tK2bSg7d25nwICYq9t37txOv34Dqvw8QjQ2lpoLruXh4YGHh0eVn+F6KSkpzJnzCS+99BpOTs44OTnj7OxcYUF1hY+PDyNGjGLEiFEUFRVx6NABtm7dzPLlS2nWLJCOHTtf3decc5ZOp+OOwQoXL+WyW01m1aaTjO6j7cTdjaagys0vYsFaFWsrHXcPDcXKynS7Ky1ZaGgYn302l9DQsAr3iY+PIzq6a5XH6tatB59//jHp6Zdxd/cAIDExgenTH2P8+MmMGDGK8PB2TJ06kT17dpXpUt+/fx/duvUo97i16eafMGEyr7/+CuHh7YiMjGLlyhWkpiYzevRtNTqeEI1VY88FtfXhh+8RHd2N3r37Xt0WHBxS4ZN+ly9fJj398g3bPT29GDZsJMOGjSy3J8ycc5aNtRXTbo3g9fm7WLX5FM18XegS6qddPJqduY59t+E4lzLyuaVXEIF+8lSfKassger1eo4fP3bDUyflCQlpTVhYO9at+43bbhtHRkY6Tz31CD179r46YDU4uDX9+8cwZ86nzJlj6LrPz89n48Y/ef/9Tyo7fI0MHDiY9PR05s+fS2pqCq1ahfDee7Pw929a5+cSwtw15lxQG1u2bGLXru18803ZqQtCQtpUWFAtW7a4RmO1zD1nuTrZ8eht7Xlz4W7m/nKEJp6Omk3irdNyKvvk5EyjTu73mVuZr5OmZZT5Ou7sZd5ZtIcAH2devasLtjYyEN1SbNu2hVmzZvDNN8uxtjZuUOKKFcvYtGkDH3zwaT1H17hV1S4r4uvr2mi6j43JYTX9PonqkVxg2fbEJfPJ9wfxdrPn5aldcHO+cUze9WrSNivLX2ZfeRQWFfPVr0fRAXcPDZViysJ0796TMWPGkZycZPR7bGxseOKJ6fUYlRCioUkusGyd2voyuk8rUjPy+eyHgxQVlzR4DGZ/y2/V5lNcvJTDoOjmhDTT5l630Nbtt0+o1v6jRo2pp0iEEFqSXGDZRvYM4lxSFrvUZBb9HsedQ5QGnf7BrLtzzlzM5NdtZ/Bxd2DMTdqO7hdCCCGEdnQ6HfcMD6e5nwsb9l3gr73nG/T8ZltQlZTomb9GpUSv586bFZOY1EsIIYQQ2rG3s+aR2yJxcbRl8bp44s5ebrBzm21B9efe85xMyKB7eBMiWpn2BGRCCCGEaBg+7o5MGx2BXg+f/XCQSxk3zoJfH8yyoErLzGfFhuM42dswfmAbrcMRQgghhAkJbenJhIGtycgp5OPvD1JQWFzv5zTLgmrx73HkFRQzbkBr3I14NFIIIYQQlmVg50B6RzbldGIm89ccpb6niTLLgmp3XDJtA93p3d48Jh4TQgghRMPS6XRMGdKWVk3d2Hr4Ir/vPFuv5zPLgsraSsedN4dqvhCiEEIIIUyXrY01D4+JxN3ZjmV/Hif2dFq9ncssC6ph3VsS4ONc9Y5CCCGEsGiervZMuzUCnQ5mrzxEanr9DFI3y4JqRM+WWocghBBCCDPRJtCDSTFtyMot5JMf6meQulkWVLY2MueUEEIIIYzXr2Ozq4PUF/6m1vnxzbKgEkIIIYSojiuD1IP8Xdl8MLHOj2/ya/ll5RbiqQ9Br4cW/q5Qv089CiGM1N63AwA2NlYUFTX8QqTmQr5PQpgOWxtrHro1kte+3ol7cQj+Xo44O9nVSdvU1fe8DJVJTs6s8uRf/3qUjfsvMK5/a6aMaEdycmZDhCaEMJKvr2u12qWvr2ujeTzXmBx2RXW/T0KI+hN7Oo33l+7D1dmWj5/qT1F+oVHvqyx/mfQtv+Pn0/l7/wWa+ToTEx2odThCCCGEaATCWnoytl8I6VkF/HfhLoqKa99DZbIFVXFJCQt/U9EDUwYr2FibbKhCCCGEMDNDujYnWvHl8IlUvvvreK2PZ7JVyl97L3DmYha9Ivxp29xD63CEEEII0YjodDruHhZGoJ8Lv+08y47Yi7U6nkkWVBk5Bfyw8QSO9jbc3r+11uEIIYQQohFytLfhhbu6Ym9nzVerj3I+OavGxzLJgur7DSfIyS9idO9WuMnix0IIIYSoJ82buHLPsDDyC4v55PuD5OQV1eg4JjdtwsmEDMNAdB9n+ndqBkDM8puAfx47Xnf7Ri1DFEIg7dJY8n0SwjRd3zbv7zaPNdvP8NXq2NKlaqr3QLJJFVQlej2Lf49DD0wa1PbqQPQDyfs0jUsIcSNpl8aR75MQpun6tnnbbcGcuJDB7rhkftt5liFdW1TreCZ1y2/roUSOX8ggOtSPsJaeWocjhBBCCAthbWXFg6Pa4e5sx/I/jxN39nK13m8yBVVOXhHL/zqOnY0V42UguhBCCCEamLuLPf83qh0As388RHpWvtHvNZmCatXmk2RkFzC8R0u83R20DkcIIYQQFkhp4clt/YJJzypgzqrDFJcYN+mnSRRUCanZrN99Dl8PB27uVr17lkIIIYQQdenmri3o2MaHo2cu88PGk0a9xyQKqm//OEZxiZ7xA9pga2OtdThCCCGEsGA6nY57hofj5+nI6m2n2Xcspcr3aF5QHTyRyoHjqYS19KRjGx+twxFCCCGEwMnBhmmjI7CxtmLuz0dIuZxb6f6aFlRFxSUsXR+PTgcTBrap9pwPQgghhBD1pUUTV+4Y3JbsvCJm/3io0n01Laj+2nuehNQc+kYF0NzPRctQhBBCCCFu0Kd9U3q08+dkQmal+2laUP246SSO9taM7hOsZRhCCCGEEOXS6XTcOUQhwMe50v00Laiy84oY2VPW6xNCCCGE6bK3s2ba6IhK99G0oPLzdCQmOlDLEIQQQgghqmTSPVTjB7S+ul6fEEIIIYS50rSa6dBapkkQQgghhPnT6fV6rWMQQgghhDBrcr9NCCGEEKKWpKASQgghhKglKaiEEEIIIWpJCiohhBBCiFqSgkoIIYQQopakoBJCCCGEqCUpqIQQQgghakkKKiFEjSiKcpeiKO9oHYcQQtREXecwKaiEEEIIIWrJRusAqqIoihvwJeAB+AD/U1V1tqZBCSGu6KEoynrADfi3qqq/aB2QqZEcJoRJq7McZg49VK2BpaqqDgZGAE9qHI8Q4h/ZQAwwHPhEURRzyCkNTXKYEKarznKYyfdQAYnA44qijAEyAFuN4xFC/GOTqqp6IElRlHTAG0jWOCZTIzlMCNNVZznMHK4mnwa2qqp6B7Ac0GkcjxDiH10AFEXxB1yAFG3DMUmSw4QwXXWWw8yhh+onYLaiKJOBVKBIURR7VVXzNY5LCAGOiqL8gSERPVB6pSfKkhwmhOmqsxym0+sl/wkhhBBC1IY53PITQgghhDBpUlAJIYQQQtSSFFRCCCGEELUkBZUQQgghRC1JQSWEEEIIUUtSUAkhhBBC1JIUVEIIIYQQtSQFlWhQiqLMUxTl1dJ/t1EUJU5RlE5axyWEEFWR/CUqIxN7igalKEozYDcwFFgE3K+q6iZtoxJCiKpJ/hKVkR4q0aBUVT0PzAf+Bp6QZCSEMBeSv0RlpKASDUpRFD9gGJANnNU4HCGEMJrkL1EZc1gcWTQSiqJ4AL8C/wZ8gf8CIzUMSQghjCL5S1RFeqhEg1AUxQn4GfhMVdUVwJdAG0VR+msbmRBCVE7ylzCGDEoXQgghhKgl6aESQgghhKglKaiEEEIIIWpJCiohhBBCiFqSgkoIIYQQopakoBJCCCGEqCUpqIQQQgghakkKKiGEEEKIWvp/dcc37eQKGRgAAAAASUVORK5CYII=\n" }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "x = np.linspace(-0.5,1.5, 100)\n", "a, b = 0.1, 1.1\n", "ylim = [0.5, 2]\n", "\n", "options = dict(\n", " xlabel='$x$',\n", " ylabel='$f (x)$',\n", " xlim=[a-0.05, b+0.05],\n", " ylim=ylim,\n", " xticks=[a, b],\n", " xticklabels=['a', 'b'],\n", " yticks=ylim,\n", " yticklabels=['', '']\n", ")\n", "\n", "\n", "fig, (ax0, ax1) = plt.subplots(1,2,figsize=[10,4])\n", "f = lambda x: 1.5 - 2*(x-0.75)**2\n", "ax0.set(title='Internal Maximum', **options)\n", "ax0.plot(x, f(x))\n", "ax0.plot([a, a], ylim,'g--',linewidth=4)\n", "ax0.plot([b, b], ylim,'g--',linewidth=4)\n", "xstar = 0.75\n", "ystar = f(xstar)\n", "ax0.plot(xstar,ystar,'ro',ms=10)\n", "ax0.annotate(\"$x-a>0\\Rightarrow\\lambda=0$\\n$b-x>0\\Rightarrow\\mu=0$\\n$\\Rightarrow f\\,'(x)=0$\", (0.55,0.75),fontsize=14)\n", "\n", "\n", "g = lambda x: 2 - 0.75*(x + 0.25)**2\n", "ax1.set(title='Corner Maximum', **options)\n", "ax1.plot(x, g(x))\n", "ax1.plot([a, a], ylim,'g--',linewidth=4)\n", "ax1.plot([b, b], ylim,'g--',linewidth=4)\n", "ax1.plot(a,g(a),'ro',ms=10)\n", "ax1.annotate(\"$x=a\\Rightarrow\\lambda\\geq0$\\n$b-x>0\\Rightarrow\\mu=0$\\n$\\Rightarrow f\\,'(x)=-\\lambda\\leq0$\", (0.35,0.75), fontsize=14);" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.4" } }, "nbformat": 4, "nbformat_minor": 2 }